﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Grid;
using System.Linq;

namespace QuanLyKhachSan
{
    public partial class FrmPhanQuyen : DevExpress.XtraEditors.XtraForm
    {
        DataClassesKhachSanDataContext dc; 

        // Business Object <-> Persistence Object (LinQ) - Tạo mới, thêm, sửa, xóa <-> Data store (SQL Server 2005)
        // Business Layer  <-> Data Access Layer <-> Storage Layer
        IEnumerable nhanVienLinqObj;

        IEnumerable chucVuLinqObj;

        IEnumerable quyenSuDungLinqObj;

        // Thao tác của người dùng đã được lưu/chưa được lưu
        Boolean saved;

        // Cờ cho biết nội dung mật khẩu đã thay đổi hay thêm mới
        Boolean flagChangePassword = false;

        DialogResult result;

        public FrmPhanQuyen()
        {
            saved = true;

            dc = new DataClassesKhachSanDataContext(SystemInfo.pub_ConnString);

            nhanVienLinqObj = dc.NHAN_VIENs;

            chucVuLinqObj = dc.CHUC_VUs;

            quyenSuDungLinqObj = dc.QUYEN_SU_DUNGs;

            InitializeComponent();
        }

        private void FormPhanQuyen_Load(object sender, EventArgs e)
        {
            gcQuanLyTaiKhoan.DataSource = nhanVienLinqObj;

            repositoryItemLookUpEditChucVu.DataSource = chucVuLinqObj;
            repositoryItemLookUpEditChucVu.DisplayMember = "CV_TEN";
            repositoryItemLookUpEditChucVu.ValueMember = "CV_ID";

            repositoryItemLookUpEditQuyenSuDung.DataSource = quyenSuDungLinqObj;
            repositoryItemLookUpEditQuyenSuDung.DisplayMember = "QSD_TEN";
            repositoryItemLookUpEditQuyenSuDung.ValueMember = "QSD_ID";
        }

        // Nút xóa
        private void btXoa_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            // Grid view không có dòng nào
            if (gvQuanLyTaiKhoan.RowCount == 0)
            {
                XtraMessageBox.Show("Không có dữ liệu để xóa.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                result = XtraMessageBox.Show("Bạn có chắc muốn xóa?", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                if (result == DialogResult.Yes)
                {
                    int rowHandles = gvQuanLyTaiKhoan.FocusedRowHandle;

                    try
                    {
                        gvQuanLyTaiKhoan.DeleteRow(rowHandles);

                        // Thay đổi chưa được cập nhật vào cơ sở dữ liệu
                        // Người dùng cần nhấn nút lưu để lưu thông tin tài khoản
                        saved = false;
                    }
                    catch (Exception)
                    {
                        throw;
                    }

                }
            }
        }

        // Nút lưu
        private void btLuu_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                gvQuanLyTaiKhoan.MoveLast();
                gvQuanLyTaiKhoan.MoveFirst();

                // Cập nhật thông tin thay đổi vào cơ sở dữ liệu
                dc.SubmitChanges();

                // Thay đổi đã được cập nhật vào cơ sở dữ liệu
                saved = true;

                if (this.Text.Substring(this.Text.Length - 1, 1) == "*")
                {
                    this.Text = this.Text.Substring(0, this.Text.Length - 1);
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("Cannot insert duplicate key in object 'dbo.Nguoi_Dung'"))
                {
                    // Lỗi phát sinh khi thêm nhưng nếu người dùng cập nhật cơ sở dữ liệu -> saved
                    // Thay đổi đã được cập nhật vào cơ sở dữ liệu
                    saved = true;

                    XtraMessageBox.Show("Có lỗi trong quá trình lưu dữ liệu.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.Close();
                }
                else
                {
                    throw;
                }
            }
        }

        // Enables you to perform manual validation of cell values
        private void gvQuanLyTaiKhoan_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e)
        {
            flagChangePassword = false;

            string NewValue;

            #region Validate Tên đăng nhập
            // Tên đăng nhập 
            if (gvQuanLyTaiKhoan.FocusedColumn == colNV_ACC)
            {
                NewValue = (string)e.Value;

                if (NewValue != null)
                {
                    if (NewValue.Trim() == "")
                    {
                        e.Valid = false;
                        e.ErrorText = "Tên đăng nhập không được để trống!";
                    }
                    else
                    {

                        for (int i = 0; i < gvQuanLyTaiKhoan.RowCount; i++)
                        {
                            string OldValue = (string)gvQuanLyTaiKhoan.GetRowCellValue(i, colNV_ACC);
                            int[] rowHandle = gvQuanLyTaiKhoan.GetSelectedRows();
                            if (OldValue.ToUpper().Trim() == NewValue.ToUpper() && i != rowHandle[0])
                            {
                                e.Valid = false;
                                e.ErrorText = "Tên đăng nhập này đã tồn tại!";

                                break;
                            }
                        }
                        
                    }
                }
            }
            #endregion

            //#region Validate Quyền sử dụng
            //// Quyền sử dụng
            //if (gvQuanLyTaiKhoan.FocusedColumn == colND_QuyenSuDung)
            //{
            //    NewValue = (string)e.Value;

            //    if (NewValue != null)
            //    {
            //        if (NewValue.Trim() == "")
            //        {
            //            e.Valid = false;
            //            e.ErrorText = "Quyền sử dụng không được để trống!";

            //        }
            //    }
            //}
            //#endregion

            #region Validate Mật khẩu
            // Mật khẩu
            if (gvQuanLyTaiKhoan.FocusedColumn == colNV_PASS)
            {
                NewValue = (string)e.Value;

                if (NewValue != null)
                {
                    if (NewValue.Trim() == "")
                    {
                        e.Valid = false;
                        e.ErrorText = "Mật khẩu không được để trống!";

                    }
                    else
                    {
                        flagChangePassword = true;
                    }
                }
            }
            #endregion
        }

        // InvalidValueExceptionEventArgs e = false 9gvQuanLyTaiKhoan ValidatingEditor Event)
        private void gvQuanLyTaiKhoan_InvalidValueException(object sender, InvalidValueExceptionEventArgs e)
        {
            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.DisplayError;
        }

        /* 
         * Khi con trỏ nhảy xuống một dòng (đang sửa dòng hiện tại hay hoàn thành thêm một dòng mới)
         * -> sự kiện grid view Validate Row được kích hoạt
         * Nếu thuộc tính Valid của e As DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs được -> False
         * Thì sự kiện InvalidRowException sẽ được kích hoạt
         * Nếu thuộc tính Valid của e As DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs được -> True
         * Thì sự kiện RowUpdated của grid view sẽ được kích hoạt */

        /* Row validation: Such validation is useful when the integrity of the row's data is important 
         * (when values in some fields depend on values in other fields).
         * perform validation when the row is about to lose focus
         */

        /* Bắt lỗi tên đăng nhập không được rỗng khi người dùng thêm nội dung vào một dòng mới 
         * Khi người dùng chỉnh sửa tên đăng nhập ở một dòng sẵn có và tên đăng nhập là rỗng -> bắt ở sự kiện ValidatingEditor
         */
        private void gvQuanLyTaiKhoan_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            try
            {
                // Tên nhân viên không được rỗng - NV_TEN
                string strNhanVienTen = (string)gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colNV_TEN);
                if (strNhanVienTen == null)
                {
                    // If the row fails validation, set the event's Valid parameter to false. 
                    // Otherwise, leave the Valid parameter set to true.
                    e.Valid = false;

                    gvQuanLyTaiKhoan.SetColumnError(colNV_TEN, "Tên nhân viên không được để trống!");
                }

                // Địa chỉ nhân viên không được rỗng - NV_DIACHI
                string strDiaChiNhanVien = (string)gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colNV_DIACHI);
                if (strDiaChiNhanVien == null)
                {
                    // If the row fails validation, set the event's Valid parameter to false. 
                    // Otherwise, leave the Valid parameter set to true.
                    e.Valid = false;

                    gvQuanLyTaiKhoan.SetColumnError(colNV_DIACHI, "Địa chỉ nhân viên không được để trống!");
                }

                // Tên đăng nhập được rỗng
                //string strTenDangNhap = (string)gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colNV_ACC);
                //if (strTenDangNhap == null)
                //{
                //    // If the row fails validation, set the event's Valid parameter to false. 
                //    // Otherwise, leave the Valid parameter set to true.
                //    e.Valid = false;

                //    gvQuanLyTaiKhoan.SetColumnError(colNV_ACC, "Tên đăng nhập không được để trống!");
                //}

                // Quyền sử dụng không được rỗng 
                //string ND_QuyenSuDung = (string)gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colND_QuyenSuDung);
                //if (ND_QuyenSuDung == null)
                //{
                //    // If the row fails validation, set the event's Valid parameter to false. 
                //    // Otherwise, leave the Valid parameter set to true.
                //    e.Valid = false;

                //    gvQuanLyTaiKhoan.SetColumnError(colND_QuyenSuDung, "Quyền sử dụng không được để trống.");
                //}

                // Chức vụ không được rỗng 
                if (Convert.ToInt32(gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colCV_ID)) == 0)
                {
                    // If the row fails validation, set the event's Valid parameter to false. 
                    // Otherwise, leave the Valid parameter set to true.
                    e.Valid = false;
                    gvQuanLyTaiKhoan.SetColumnError(colCV_ID, "Chức vụ không được để trống.");
                }

                else
                {
                    if (flagChangePassword == true)
                    {
                        // MessageBox.Show((string)gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colND_MatKhau));

                        // Mã hóa ô mật khẩu do người dùng nhập
                        string ND_MatKhau = EncryptionUtility.EncryptString(
                            (string)gvQuanLyTaiKhoan.GetRowCellValue(e.RowHandle, colNV_PASS),
                            SystemInfo.pub_KeyForEncrytion);

                        // MessageBox.Show(ND_MatKhau);

                        gvQuanLyTaiKhoan.SetRowCellValue(e.RowHandle, colNV_PASS, ND_MatKhau);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        //  e.Valid = false;
        private void gvQuanLyTaiKhoan_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }


        //  e.Valid = true;
        // Chỉnh sửa thông tin của dòng đã có hoặc thêm thông tin vào dòng mới
        // ValidatingEditor event -> InvalidValueException
        // ValidateRow event -> InvalidRowException
        private void gvQuanLyTaiKhoan_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            // Thay đổi chưa được cập nhật vào cơ sở dữ liệu
            // Người dùng cần nhấn nút lưu để lưu thông tin tài khoản
            saved = false;
            if (this.Text.Substring(this.Text.Length - 1, 1) != "*")
            {
                this.Text = this.Text + "*";
            }
        }

        // Tự điền số thứ tự cho grid
        private void gvQuanLyTaiKhoan_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName == "")
            {
                if (e.RowHandle >= 0)
                {
                    e.DisplayText = (e.RowHandle + 1).ToString();
                }
            }
        }

        private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            this.Close();  
        }

        private void FrmPhanQuyen_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (saved == false)
            {
                result = XtraMessageBox.Show("Dữ liệu chưa được lưu!\nBạn có muốn lưu không?", "Quản lý người dùng", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (result == System.Windows.Forms.DialogResult.Yes)
                {
                    dc.SubmitChanges();
                }
                else if (result == System.Windows.Forms.DialogResult.Cancel)
                {
                    e.Cancel = true;
                }
            }
        }

        private void gvQuanLyTaiKhoan_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            
        }

     }
}

